Seminário sobre Ruby - 1/2013
Grupo: ' *Danilo Freire de Holanda Paiva - *Gabriel Franklin Braz de Medeiros - 10/0102018 *Gustavo de Almeida - 10/0012183 *Lavousier Ferreira - 09/0120876 *Miguel Cristaldo - 10/0116493 Introdução Ruby é uma linguagem de programação dinâmica e de uso geral, que combina sintaxe de Pearl com características de Smalltalk. É uma linguagem que tem suporte para múltiplos paradigmas (funcional, orientada a objetos, imperativa e reflexiva) e está disponível para diversas plataformas, como Microsoft Windows, Linux, Solaris e MAC OS X. Histórico A linguagem Ruby foi concebida no dia 24 de fevereiro de 1993 pelo japonês Yukihiro Matsumoto, com o intuito de que fosse criada uma nova linguagem funcional e em equilíbrio com a programação imperativa. Matsumoto disse: "Eu queria uma linguagem de script que fosse mais poderosa do que Pearl, e mais orientada a objetos do que Python, é por isso que decidir criar minha própria linguagem." Após o lançamento do Ruby 1.3 em 1999, iniciou-se a primeira lista de discussão em inglês chamada ''Ruby-Talk, marcando um interesse crescente na linguagem fora do Japão. Em setembro de 2000, o primeiro livro em inglês sobre a linguagem foi impresso, sendo mais tarde liberado gratuitamente para o público e ajudando no processo de adoção de Ruby por falantes do inglês. Por volta de 2005, o interesse pela linguagem Ruby subiu em conjunto com o Ruby on Rails, um framework de aplicações web popular escrito em Ruby. Rails é frequentemente creditada como a aplicação que tornou Ruby "famosa" e a associação é tão forte que ambos são muitas vezes confundidos por programadores que são novos a Ruby. Critérios de Avaliação da Linguagem '''Legibilidade O Ruby é uma linguagem muito prática e foi criada pra ser assim. Yukihiro Matsumoto quando resolveu criar o Ruby pensou em reunir tudo que ele julgava existir de melhor nas linguagens da época e nesse “pacote” ele acrescentou outras características interessantes. Assim, ele fez questão de fazer da linguagem um exemplo de clareza, legibilidade e inteligibilidade. Quanto aos tipos, o Ruby mostra-se uma linguagem bastante criteriosa ao ponto de ter, por exemplo, duas classes para representar o que nas outras linguagens seria o tipo Boolean, substituído pela TrueClass e pela FalseClass. Entre os tipos temos também o Fixnum para números pequenos, Bignum para números grandes, String, Array, Hash, Lambda, Range entre outros. 'Capacidade de escrita' Ruby é uma linguagem de programação interpretada, com tipagem forte e dinâmica, que tem como foco a simplicidade e produtividade. Sua sintaxe é extremamente elegante, o que facilita muito a capacidade de escrita de códigos. Muitas linguagens não tratam números e outros tipos primitivos como objetos, mas no Ruby isso é diferente. No Ruby, tudo é objeto. Tipos primitivos possuem métodos e podem ter atributos. Classes também são tratadas como objetos. 'Confiabilidade' Ruby é uma linguagem que realiza a verificação de tipos de variáveis e tem suporte ao tratamento de exceções. Exceções são uma forma eficiente e "limpa" de tratar erros e outras situações previstas e imprevistas em um programa. Ruby (assim como outras linguagens OO), usa objetos para representar exceções. Tais objetos são da classe Exception, e têm uma String com uma mensagem de erro, e informações sobre o estado da pilha (stack traceback). Para causar uma exceção é usado o método raise (ou fail), da classe Kernel. raise pode ter as seguintes formas: raise raise mensagem_ou_exceção raise tipo_de_erro, mensagem raise tipo_de_erro, mensagem, traceback Para responder a uma exceção, é usado o comando rescue em uma expressão begin ou método. O comando else pode ser usado para executar um bloco quando rescue não for acionado. ensure pode ser usado para definir um bloco que será executado sempre. def espera_regexp(re) linha = readline while linha !~ re rescue EOFError puts "Fim do arquivo." linha = nil else linha ensure if linha.class != String || linha != nil linha = nil end end O comando retry também pode ser usado no tratamento de erros. Ele faz com que o bloco atual seja executado novamente, desde o início. Mas deve-se ter cuidado para não gerar laços infinitos. Throw/Catch Os métodos throw e catch são parecidos com raise e rescue, porém, não lidam com exceções, mas sim com símbolos ou strings (labels). Catch executa o bloco que lhe é passado, mas pára a execução caso um throw seja executado com o símbolo correspondente. O objeto retornado é o da última expressão do bloco, caso ele termine normalmente, ou o que for passado a throw, ou nil. resultado = catch(:aie) { puts "Executando catch ..." throw(:aie, "ops") puts "Não vai chegar aqui." "Fim." } puts resultado # >> ops Sintaxe e Semântica Palavras reservadas de Ruby, fazem parte da classe Object: #BEGIN : designa um bloco que será executado incondicionalmente no começo do programa; #END : designa um bloco que será executado logo antes de terminar o programa; #__ENCODING__ : a codificação corrente default; #__END__: denota o final de uma parte do código, nada após _END_ será executado; #__FILE__: nome do arquivo, incluindo o caminho, que esta sendo executado; #__LINE__: número da linha que esta sendo executada, no arquivo corrente; #alias : cria um alias ou método duplicado para um método, o método original ainda pode ser chamado; #and : operador lógico AND; #begin: inicia um bloco, pode servir de definição de escopo; #break: termina incondicionalmente a execução de um bloco de código; #case: semelhante ao switch do C/C++, escolhe determinado caso em função de uma variável; #class: começa a defição de uma classe; #def: junto com o delimitador end define um método; #defined?: testa existe qualquer coisa definida com essa expecificação, variável, metodo...; #do: junto com o delimitador end define um bloco de código; #else: define um desvio final pode ser pareado com if, unless, case e rescue. #elsif: define um desvio, inúmeros elsif podem ser colocados em um único bloco; #end: delimitador de fim; #ensure: final parte de um bloco que sempre é executada; #false: booleano de falso; #for: construtor de laço, semelhante à C/C++; #if: condicional, caso a expressão analisada seja verdadeira o código "protegido" é executado; #in: usado com o for para definir o contexto que o for será executado; #module: inicia um bloco de definição de módulo; #next: usado junto com while ou until, cria um iterador que não permite a execução da parte do código seguinte; #nil: instancia única da classe NilClass, é um não-objeto, valor de arrays não inicializados; #not: negação booleana; #or: ou booleano; #redo: solicita a reexecução do bloco anterior com os mesmos parâmetros; #rescue: tratamento de exceção; #retry: dentro de um bloco de rescue, repete o bloco que a exceção ocorreu; #return: retorna para o contexto antes do bloco; #self: semelhante ao this de C++, refere à um atributo de uma instância; #super: busca na classe primitiva um método com o mesmo nome; #then: opcional, é usado após condicionais; #true: verdadeiro booleano; #undef: retira uma definição previa; #unless: funciona como um if mas permite a passagem no caso da expressão seja falsa; #until: inverso do while, executa o código até que a condição seja falsa; #when: usado com case, define as opções; #while: executa o código ate que a condição seja verdadeira; #yield: chama uma exceção ou controla parte do código. Referência: http://ruby-doc.org/docs/keywords/1.9/Object.html Sobre a sintaxe: Não se faz declarações de variáveis em Ruby, mas temos algums "Tipos Básicos" dados. Números podem ser representados como integers ou floats: Exemplos: -2, 1_000_000, 3.14, 2.2e-10. Strings consistem de caracteres, números e pontuação: Exemplo: "exemplo_string", '123123' , "fatorial!" Symbols representam nomes e algumas strings no interpretador Ruby: Exemplo: :symbol Constantes representam um valor fixo em Ruby: Exemplo: Const, Tax Arrays são conjuntos de um tipo de objeto ordenados por inteiros: Exemplo: 2, 3, , 'vetor' , 'strings' Hashes são um conjunto de chaves com valores únicos, “um dicionário”: Exemplo: {'a'=> 'azul' , 'b'=> 'bege'} Range representa um intervalo com início e fim: Exemplo: {1..4}, {1...5}, {'A'..'Z'} Modificadores de escopo: Variáveis globais: Exemplo: $global Variável de Instância: Exemplo: @cor Variável de Classe: Exemplo: @@tamanho Argumentos de Bloco: Exemplo: |x,y| Classes: Ruby suporta herança, mas não herança múltipla. Exemplo de Classe: class Cama @@no_de_pernas=4 def initialize(tipo, tamanho, cor) @tipo= tipo @tamanho=tamanho @cor=cor end def fazer puts “Fazendo a cama” end end Nessa classe temos a variável de classe @@no_de_pernas, três variáveis de instância (@tipo,@tamanho e @cor), dois métodos, o de inicialização e o fazer. Podemos usar essa classe com: cama1 = Cama.new(“casal”,”grande”,”verde”) # cria uma nova Cama cama1.fazer # chama o método fazer de cama Blocks: São semelhantes às funçoes de C, e podem receber parâmetros e ser chamados de outros pontos do código. Exemplo: do print "Estamos em um bloco" print "Que bom!" print "Estamos saido do bloco." end É importante lembrar que "print" é um método da classe Kernel. Controle de Fluxo: Ruby se aproxima muito da lingua inglesa, o que torna fácil até para um leigo entender o código. Exemplos: ---- if condição 1 # se a condição 1 for aceita faça isso faça isso elsif condição 2 #se condição 1 não for aceita mas a 2 for faça aquilo faça aquilo else # se nenhuma das duas for aceita faça outra coisa faça outra coisa end unless condição # se a condição não for aceita faça isso faça isso else # se a condição for aceita faça outra coisa faça outra coisa end while condiçao # enquanto a condição for satisfeita faça isso repita isso end until condição # enquanto a condição não for satisfeita faça isso repita isso end Comandos de iteração 2.times { print "Eco!" } repete 2 vezes Eco! ---- when Dia # se passeio for igual à Dia puts "Va para o parque" when Noite #se passeio for igual à Noite puts "Va dormir!" else # se passeio for diferente de tudo puts "Sei lá!" end Tratamento de Exceção Exemplo: begin Faça isso rescue # caso fazer isso lançar excessão Tratando excessão else #caso fazer isso não lançar excessão Faça assado ensure # sempre sera executado end Tradução da Linguagem Por ser uma linguagem interpretada, o código de um programa em Ruby não é compilado, mas possui um interpretador para traduzir o código. Ou seja, ao invés de um compilador analisar todo o código fonte do programa e gerar um bytecode para ser traduzido em código de máquina, apenas um interpretador é requerido, para fazer a interpretação de linha por linha do programa. Isto significa que o interpretador traduz o código sequencialmente, uma linha por vez, e a executa de acordo com sua operação. Um detalhe importante a se observar é que não é necessário carregar todo o arquivo novamente caso se faça uma alteração no programa, por exemplo, em uma função qualquer, o programador pode abrir novamente uma classe e definir um novo método, e este método já estará disponível para ser usado pois o interpretador já terá traduzido a mudança feita na classe. Existem diversos interpretadores para a linguagem Ruby, uma para cada aplicação diferente. Inicialmente, na criação da linguagem em 1995, existia somente um interpretador criado pelo próprio autor da linguagem, na linguagem C, chamado MRI - Matz's Ruby Interpreter. Por ser somente o primeiro, era um pouco lento e a execução do programa ficava se tornando um pouco demorada. Com o passar do tempo, novas implementações foram sendo criadas, como o JRuby, para trabalhar com Java, Rubinius, IronRuby para frameworks no microsoft .NET, MacRuby para sistemas OS X, HotRuby com flash, dentre outros. Com a criação da versão 1.9 do Ruby, outro japônes, chamado Koichi Sasada propôs a criação de outro interpretador mais rapido e mais eficiente para substituir o primeiro, o YARV (Yet another Ruby MV), e realmente substituiu. Esse interpretador era parecido com o funcionamento de uma máquina virtual para JAVA. As versões 1.9 e as posteriores, como a 2.0 passaram a utilizar este interpretador como principal, pois reduzia relativamente bem o tempo de execução de um programa em Ruby. Outras questões importantes a se citar são as diversas bibliotecas criadas para Ruby e a ferramenta GEM, cuja função é o gerenciamento dessas bibliotecas, que no total somam mais de 3000. Em 2005 também, uma nova aplicação foi desenvolvida, um framework chamado Ruby on Rails para facilitar a sua utilização com aplicações web, e a partir desse novo framework, os usuário da linguagem aumentaram substancialmente, pois agora estava ainda mais fácil e prático programar em Ruby. Category:Content Category:Sintaxe e semântica Category:Tradução da Linguagem